/**
 * 
 */
package com.mpo.ejb.persistence.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

//import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mpo.common.util.ConstantesApplication;
import com.mpo.common.util.SeguridadesException;
import com.mpo.ejb.persistence.dao.PerfilDAO;
import com.mpo.ejb.persistence.entities.Perfil;
import com.mpo.ejb.persistence.entities.Usuario;

/**
 * @author
 *
 */
public class PerfilDAOImpl extends AbstractFacadeImpl<Perfil> implements
		PerfilDAO {

	private static final Logger slf4jLogger = LoggerFactory
			.getLogger(PerfilDAOImpl.class);

	public PerfilDAOImpl(EntityManager entityManager) {
		super(entityManager);
	}

	public PerfilDAOImpl() {
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Perfil> obtenerModuloUsuario(Usuario usuario)
			throws SeguridadesException {

		slf4jLogger.info("obtenerPerfilUsuario");

		List<Perfil> modulosUsuario = null;

		try {

			Query query = entityManager.createQuery("select m from Perfil m "
					+ " where m.idPerfil = ?");
			query.setParameter(1, usuario.getPerfil().getIdPerfil());

			modulosUsuario = query.getResultList();

		} catch (Exception e) {
			throw new SeguridadesException(e);
		}

		return modulosUsuario;
	}

	@Override
	public List<Perfil> obtenerPerfilCriterios(Perfil perfilDTO)
			throws SeguridadesException {

		slf4jLogger.info("obtenerPerfilCriterios");

		Predicate predicate = null;
		List<Predicate> criteriaList = null;

		try {
			CriteriaBuilder criteriaBuilder = entityManager
					.getCriteriaBuilder();
			CriteriaQuery<Perfil> criteriaQuery = criteriaBuilder
					.createQuery(Perfil.class);

			Root<Perfil> fromPerfil = criteriaQuery.from(Perfil.class);
			criteriaQuery.select(fromPerfil);

			criteriaList = new ArrayList<Predicate>();

			// por nombre de compania
			if (StringUtils.isNotEmpty(perfilDTO.getNombrePerfil())) {
				Expression<String> nombrePerfil = criteriaBuilder
						.upper(criteriaBuilder.literal(perfilDTO
								.getNombrePerfil()));
				predicate = criteriaBuilder.equal(criteriaBuilder
						.upper(fromPerfil.<String> get("nombrePerfil")),
						nombrePerfil);
				criteriaList.add(predicate);
			}

			// estado activo
			if (StringUtils.isNotEmpty(perfilDTO.getEstado())) {
				predicate = criteriaBuilder.equal(fromPerfil.get("estado"),
						perfilDTO.getEstado());
				criteriaList.add(predicate);
			}

			// por empresa
			// if (perfilDTO.getNpEmpresaDTO() != null &&
			// perfilDTO.getNpEmpresaDTO().getIdEmpresa()!=null) {
			//
			// }

			criteriaQuery.where(criteriaBuilder.and(criteriaList
					.toArray(new Predicate[0])));
			criteriaQuery.orderBy(criteriaBuilder.asc(fromPerfil
					.get("fechRegistro")));

			TypedQuery<Perfil> typedQuery = entityManager
					.createQuery(criteriaQuery);

			return typedQuery.getResultList();

		} catch (Exception e) {
			throw new SeguridadesException(
					"Error al obtener perfil por criterios");
		} finally {
			predicate = null;
			criteriaList = null;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Perfil> obtenerPerfilEmpresa(Perfil perfilDTO)
			throws SeguridadesException {

		slf4jLogger.info("obtenerPerfilEmpresa");

		List<Perfil> perfilCol = null;

		try {

			if (perfilDTO.getNpEmpresaDTO() != null
					&& (Integer) perfilDTO.getNpEmpresaDTO().getIdEmpresa() != null) {

				Query query = entityManager
						.createQuery("select p from Perfil p join p.modulos m where m.idModulo = ? and p.estado = ? and  m.estado = ? ");
				query.setParameter(1, perfilDTO.getNpIdModulo());
				query.setParameter(2, ConstantesApplication.ESTADO_ACTIVO);
				query.setParameter(3, ConstantesApplication.ESTADO_ACTIVO);
				perfilCol = query.getResultList();

			}

		} catch (Exception e) {
			slf4jLogger.info("error al obtenerPerfilEmpresa {}", e);
			throw new SeguridadesException(e);
		}

		return perfilCol;
	}

	@Override
	public void moduloPerfil(Integer idModulo, Integer idPerfil)
			throws SeguridadesException {
		slf4jLogger.info("moduloPerfil");

		try {

			Query query = entityManager
					.createNativeQuery("INSERT INTO modulo_perfil (ID_PERFIL, ID_MODULO) "
							+ " VALUES(?,?)");
			query.setParameter(1, idPerfil);
			query.setParameter(2, idModulo);
			query.executeUpdate();
		} catch (Exception e) {
			throw new SeguridadesException(e);
		}
	}

	@Override
	public void deleteModulosPerfil(Integer idPerfil)
			throws SeguridadesException {
		slf4jLogger.info("deleteModulosPerfil");

		try {

			Query query = entityManager
					.createNativeQuery("DELETE FROM modulo_perfil WHERE id_perfil= ? ");
			query.setParameter(1, idPerfil);
			query.executeUpdate();
		} catch (Exception e) {
			throw new SeguridadesException(e);
		}

	}

}
